package org.student.impl;

import java.io.Serializable;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.ScrollableResults;
import org.hibernate.Session;
import org.springframework.dao.DataAccessException;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.stereotype.Component;
import org.student.dao.IHibernateDao;
import org.student.entity.PageInfo;

/**
 * 项目名称: 学生管理系统
 * 类名称: HibernateDaoImpl
 * 类描述: HibernateDaoImpl底层实现类
 * 创建人： 严植培
 * 创建时间: 2011-9-1 下午02:27:33
 */

@SuppressWarnings("all")
@Component
public class HibernateDaoImpl extends SuperHibernateTemplate implements IHibernateDao {
	
	/**
	 * 根据ID,删除对象
	 * @param clazz 对象类型
	 * @param id 编号id
	 */
	public void delete(Class clazz, Serializable id)  throws DataAccessException{
		super.getHibernateTemplate().delete(load(clazz, id)) ;
	}

	/**
	 * 删除对象
	 * @param object 任意对象
	 */
	public void delete(Object object)  throws DataAccessException{
		super.getHibernateTemplate().delete(object) ;
	}

	/**
	 * 删除所有对象
	 * @param clazz 对象类型
	 * @return Integer
	 */
	public Integer deleteAll(final Class clazz)  throws DataAccessException{
		return (Integer) super.getHibernateTemplate().execute(new HibernateCallback() {
					public Object doInHibernate(Session session) {
						Query query = session.createQuery("delete " + clazz.getName()) ;
						return new Integer(query.executeUpdate()) ;
					}
				}) ;
	}

	/**
	 * 根据SQL,参数删除对象
	 * @param queryString SQL语句
	 * @param parameters 参数
	 * @return Integer
	 */
	public Integer deleteByQuery(final String queryString,final Object[] parameters)  throws DataAccessException{
		return (Integer) super.getHibernateTemplate().execute(new HibernateCallback() {
					public Object doInHibernate(Session session) {
						Query query = session.createQuery(queryString) ;
						if (parameters != null) {
							for (int i = 0; i < parameters.length; i++) {
								query.setParameter(i, parameters[i]) ;
							}
						}
						return new Integer(query.executeUpdate()) ;
					}
				}) ;
	}

	/**
	 * 查询对象
	 * @param query SQL语句
	 * @return 对象集合
	 */
	public List find(final String queryString)  throws DataAccessException{
		return super.getHibernateTemplate().find(queryString) ;
	}

	/**
	 * 根据SQL,参数查询信息
	 * @param queryString SQL语句
	 * @param parameters 参数
	 * @return 对象集合
	 */
	public List find(final String queryString, final Object[] parameters)  throws DataAccessException{
		return super.getHibernateTemplate().find(queryString, parameters) ;
	}

	/**
	 * 查询对象所有信息
	 * @param clazz 对象类型
	 * @return 对象集合
	 */
	public List findAll(Class clazz)  throws DataAccessException{
		return super.getHibernateTemplate().find("from " + clazz.getName()) ;
	}

	/**
	 * 命名查询
	 * @param queryName SQL语句
	 * @return 对象集合
	 */
	public List findByNamedQuery(final String queryName) throws DataAccessException {
		return super.getHibernateTemplate().findByNamedQuery(queryName) ;
	}

	/**
	 * 根据SQL,参数命名查询
	 * @param query SQL语句
	 * @param parameter 参数
	 * @return 对象集合
	 */
	public List findByNamedQuery(final String queryName, final Object parameter) throws DataAccessException {
		return super.getHibernateTemplate().findByNamedQuery(queryName, parameter) ;
	}

	/**
	 * 根据SQL,多参数命名查询
	 * @param query SQL语句
	 * @param parameters 参数数组
	 * @return  对象集合
	 */
	public List findByNamedQuery(final String queryName,final Object[] parameters) throws DataAccessException {
		return super.getHibernateTemplate().findByNamedQuery(queryName, parameters) ;
	}

	/**
	 * 分页查询
	 * @param queryString SQL语句
	 * @param parameters 参数
	 * @param pageInfo 分页对象
	 * @return List 对象集合
	 */
	public List findPageByQuery(final String queryString,final Object[] parameters, final PageInfo pageInfo)  throws DataAccessException{
		return (List) super.getHibernateTemplate().executeWithNativeSession(new HibernateCallback() {
					public Object doInHibernate(Session session) throws HibernateException {
						Query query = session.createQuery(queryString) ; // 实例化Query对象
						if (parameters != null) {
							for (int i = 0; i < parameters.length; i++) {
								query.setParameter(i, parameters[i]) ; // 设置参数
							}
						}
						ScrollableResults sr = query.scroll() ; // 实例化ScrollableResults对象
						sr.last() ; // 取得最后一条信息
						int totalCount = sr.getRowNumber() ; // 取得总条数
						int startIndex = (pageInfo.getPageIndex() - 1) * pageInfo.getPageSize() ; // 取得当前页
						query.setMaxResults(pageInfo.getPageSize()) ; // 设置总页数
						query.setFirstResult(startIndex) ; // 设置当前页
						int totalRec = totalCount + 1 ; // 总记录数
						pageInfo.setTotalRec(totalRec) ; // 设置总记录数
						int totalPage = (totalRec % pageInfo.getPageSize() == 0) ? (totalRec / pageInfo.getPageSize()) : (totalRec / pageInfo.getPageSize()) + 1 ; // 取得总页数
						int[] pageNumbers = new int[totalPage] ; // 设置页码
						for (int i = 0; i < totalPage; i++) {
							pageNumbers[i] = (i + 1) ; // 设置页码
						}
						pageInfo.setPageNumbers(pageNumbers) ; // 设置页码
						pageInfo.setTotalPage(totalPage) ; // 设置总页数
						pageInfo.setPageSize(pageInfo.getPageSize()) ; // 设置显示行数
						pageInfo.setPageIndex(pageInfo.getPageIndex()) ; // 设置当前页
						pageInfo.setPrePage(pageInfo.getPageIndex() - 1) ; // 设置上一页
						pageInfo.setNextPage(pageInfo.getPageIndex() + 1) ; // 设置下一页
						return query.list() ; 
					}
				});
	}
	
	/**
	 * @param clazz 类名称
	 * @param id 编号
	 */
	public Object get(Class clazz, Serializable id) throws DataAccessException {
		return super.getHibernateTemplate().get(clazz, id);
	}

	/**
	 * @param queryString SQL语句
	 * @param parameters 参数
	 */
	public Object get(final String queryString, final Object[] parameters)  throws DataAccessException{
		List list = super.getHibernateTemplate().find(queryString, parameters);
		if (list != null && !list.isEmpty()) {
			return list.get(0);
		}
		return null;
	}

	/**
	 * @param clazz 类名称
	 * @param id 编号
	 */
	public Object load(Class clazz, Serializable id)  throws DataAccessException{
		return super.getHibernateTemplate().load(clazz, id);
	}

	/**
	 * @param object 对象
	 */
	public void save(Object object)  throws DataAccessException{
		super.getHibernateTemplate().save(object);
	}

	/**
	 * @param object 对象
	 */
	public void update(Object object)  throws DataAccessException{
		super.getHibernateTemplate().update(object);
	}

	/**
	 * @param queryString SQL语句
	 * @param parameters 参数
	 */
	public void updateByQuery(final String queryString,final Object[] parameters)  throws DataAccessException{
		super.getHibernateTemplate().execute(new HibernateCallback() {
			public Object doInHibernate(Session session) {
				Query query = session.createQuery(queryString);
				if (parameters != null) {
					for (int i = 0; i < parameters.length; i++) {
						query.setParameter(i, parameters[i]);
					}
				}
				query.executeUpdate();
				return null;
			}
		});
	}
}
